// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef EIGEN_TRACKBALL_H
#define EIGEN_TRACKBALL_H

#include <Eigen/Geometry>

class Camera;

class Trackball
{
  public:
	enum Mode
	{
		Around,
		Local
	};

	Trackball()
		: mpCamera(0)
	{
	}

	void start(Mode m = Around)
	{
		mMode = m;
		mLastPointOk = false;
	}

	void setCamera(Camera* pCam) { mpCamera = pCam; }

	void track(const Eigen::Vector2i& newPoint2D);

  protected:
	bool mapToSphere(const Eigen::Vector2i& p2, Eigen::Vector3f& v3);

	Camera* mpCamera;
	Eigen::Vector3f mLastPoint3D;
	Mode mMode;
	bool mLastPointOk;
};

#endif // EIGEN_TRACKBALL_H
